/*
 * This file is part of the OregonCore Project. See AUTHORS file for Copyright information
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <https://www.gnu.org/licenses/>.
 */

/* ScriptData
SDName: Boss_DrekThar
SD%Complete: 50%
SDComment:
EndScriptData */

#include "ScriptMgr.h"
#include "ScriptedCreature.h"

enum Spells
{
    SPELL_WHIRLWIND                               = 15589,
    SPELL_WHIRLWIND2                              = 13736,
    SPELL_KNOCKDOWN                               = 19128,
    SPELL_FRENZY                                  = 8269,
    SPELL_SWEEPING_STRIKES                        = 18765, // not sure
    SPELL_CLEAVE                                  = 20677, // not sure
    SPELL_WINDFURY                                = 35886, // not sure
    SPELL_STORMPIKE                               = 51876  // not sure
};

enum Yells
{
    YELL_AGGRO                                    = -1810000,
    YELL_EVADE                                    = -1810001,
    YELL_RESPAWN                                  = -1810002,
    YELL_RANDOM1                                  = -1810003,
    YELL_RANDOM2                                  = -1810004,
    YELL_RANDOM3                                  = -1810005,
    YELL_RANDOM4                                  = -1810006,
    YELL_RANDOM5                                  = -1810007
};

struct boss_drektharAI : public ScriptedAI
{
    boss_drektharAI(Creature* c) : ScriptedAI(c) {}

    uint32 uiWhirlwindTimer;
    uint32 uiWhirlwind2Timer;
    uint32 uiKnockdownTimer;
    uint32 uiFrenzyTimer;
    uint32 uiYellTimer;
    uint32 uiResetTimer;

    void Reset()
    {
        uiWhirlwindTimer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
        uiWhirlwind2Timer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
        uiKnockdownTimer = 12 * IN_MILLISECONDS;
        uiFrenzyTimer = 6 * IN_MILLISECONDS;
        uiResetTimer = 5 * IN_MILLISECONDS;
        uiYellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds
    }

    void EnterCombat(Unit* /*who*/)
    {
        DoScriptText(YELL_AGGRO, me);
    }

    void JustRespawned()
    {
        Reset();
        DoScriptText(YELL_RESPAWN, me);
    }

    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (uiWhirlwindTimer <= diff)
        {
            DoCastVictim( SPELL_WHIRLWIND);
            uiWhirlwindTimer =  urand(8 * IN_MILLISECONDS, 18 * IN_MILLISECONDS);
        }
        else uiWhirlwindTimer -= diff;

        if (uiWhirlwind2Timer <= diff)
        {
            DoCastVictim( SPELL_WHIRLWIND2);
            uiWhirlwind2Timer = urand(7 * IN_MILLISECONDS, 25 * IN_MILLISECONDS);
        }
        else uiWhirlwind2Timer -= diff;

        if (uiKnockdownTimer <= diff)
        {
            DoCastVictim( SPELL_KNOCKDOWN);
            uiKnockdownTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
        }
        else uiKnockdownTimer -= diff;

        if (uiFrenzyTimer <= diff)
        {
            DoCastVictim( SPELL_FRENZY);
            uiFrenzyTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
        }
        else uiFrenzyTimer -= diff;

        if (uiYellTimer <= diff)
        {
            DoScriptText(RAND(YELL_RANDOM1, YELL_RANDOM2, YELL_RANDOM3, YELL_RANDOM4, YELL_RANDOM5), me);
            uiYellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds
        }
        else uiYellTimer -= diff;

        // check if creature is not outside of building
        if (uiResetTimer <= diff)
        {
            if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
            {
                EnterEvadeMode();
                DoScriptText(YELL_EVADE, me);
            }
            uiResetTimer = 5 * IN_MILLISECONDS;
        }
        else uiResetTimer -= diff;

        DoMeleeAttackIfReady();
    }
};


CreatureAI* GetAI_boss_drekthar(Creature* pCreature)
{
    return new boss_drektharAI (pCreature);
}

void AddSC_boss_drekthar()
{
    Script* newscript;
    newscript = new Script;
    newscript->Name = "boss_drekthar";
    newscript->GetAI = &GetAI_boss_drekthar;
    newscript->RegisterSelf();
}
